/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package deteccao;

import java.awt.Point;
import java.awt.image.Raster;
import java.util.ArrayList;
import javax.media.jai.PlanarImage;

/**
 *
 * @author Igor
 */
public class DeteccaoMovimento {

   ArrayList<Point> pontos = new ArrayList<Point>();
   ArrayList<Point> blobs2 = new ArrayList<Point>();
   ArrayList<Point> blobs = new ArrayList<Point>();
   private Point PontoLimite = new Point();
   private boolean changeDireita = false;

    public  ArrayList<Point> detectaPonto(PlanarImage imagem) {
            Point PontoEsquerdo=null;
            Point PontoDireito=null;
            Point PontoAlto=null;
            Point PontoBaixo=null;
            pontos = new ArrayList<Point>();
            Raster raster = imagem.getAsBufferedImage().getRaster();
            int[] pixel = new int[3];
            Point ponto = null;
            for(int w=0;w<imagem.getWidth();w++) {
                for(int h=0;h<imagem.getHeight();h++)
                {
                raster.getPixel(w, h, pixel);
                    if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (PontoEsquerdo!=null) {
                            if (ponto.getX()<PontoEsquerdo.getX()) {
                                if(w<imagem.getWidth()-10)
                                PontoEsquerdo = ponto;
                            }
                        } else {
                            PontoEsquerdo = ponto;
                        }
                    }

                if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (PontoDireito!=null) {
                            if (ponto.getX()>PontoDireito.getX() && ponto.getY()<imagem.getHeight()-10 && ponto.getX()<imagem.getWidth()-10) {
                                if(w<imagem.getWidth()-10)
                                PontoDireito = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth()-10)
                            PontoDireito = ponto;
                        }
                    }

                if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (PontoAlto!=null) {
                            if (ponto.getY()<PontoAlto.getY()) {
                                if(w<imagem.getWidth()-10)
                                PontoAlto = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth()-10)
                            PontoAlto = ponto;
                        }
                    }

                if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (PontoBaixo!=null) {
                            if (ponto.getY()>PontoBaixo.getY()&& ponto.getY()<imagem.getHeight()-10) {
                                if(w<imagem.getWidth()-10)
                                PontoBaixo = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth()-10)
                            PontoBaixo = ponto;
                        }
                    }

                }
            }

            if (PontoEsquerdo!=null && PontoDireito!=null && PontoAlto!=null) {
                pontos.add(PontoEsquerdo);
                pontos.add(PontoDireito);
                pontos.add(PontoAlto);
                pontos.add(PontoBaixo);

            }
            
               return pontos;
    }


    public ArrayList<Point> geraBlobEsquerdo(PlanarImage imagem) {

       Raster raster = imagem.getAsBufferedImage().getRaster();
       int[] pixel = new int[3];
       Point pontoEsquerdo = null;
       Point pontoDireito = null;
       Point pontoAlto =null;
       Point pontoBaixo = null;
       blobs = new ArrayList<Point>();
       Point ponto = null;

       for(int w=0;w<imagem.getWidth();w++) {
         for(int h=0;h<imagem.getHeight();h++) {
                raster.getPixel(w, h, pixel);
                if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (pontoEsquerdo!=null) {
                            if (ponto.getX()<pontoEsquerdo.getX()) {
                                if(w<imagem.getWidth()-10) {
                                    pontoEsquerdo = ponto;
                                    break;
                                }
                            }
                        } else {
                            pontoEsquerdo = ponto;
                            break;
                        }
                    }
          }
        }
       
        for(int w=(int) pontoEsquerdo.getX();w<imagem.getWidth();w++) {
            boolean contem = false;
            for(int h=0;h<imagem.getHeight();h++) {
                raster.getPixel(w, h, pixel);
                ponto = new Point(w,h);

                 if (pixel[0]!=0) {
                        if (pontoBaixo!=null) {
                            if (ponto.getY()>pontoBaixo.getY()&& ponto.getY()<imagem.getHeight()-10) {
                                if(w<imagem.getWidth()-10)
                                pontoBaixo = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth()-10)
                            pontoBaixo = ponto;
                        }
                    }

                if (pixel[0]!=0) {
                        if (pontoAlto!=null) {
                            if (ponto.getY()<pontoAlto.getY()) {
                                if(w<imagem.getWidth()-10)
                                pontoAlto = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth()-10)
                            pontoAlto = ponto;
                        }
                    }

                if (pixel[0]!=0) 
                    contem=true;
            }
            if (contem==false) {
                pontoDireito=ponto;
                break;
            }
        }

       if (pontoEsquerdo!=null && pontoDireito!=null && pontoAlto!=null) {
                blobs.add(pontoEsquerdo);
                blobs.add(pontoDireito);
                if (changeDireita)
                    PontoLimite = pontoAlto;
                blobs.add(pontoAlto);
                blobs.add(pontoBaixo);
            }

       return blobs;
    }

    public ArrayList<Point> geraBlobDireito(PlanarImage imagem) {
       Raster raster = imagem.getAsBufferedImage().getRaster();
       int[] pixel = new int[3];
       Point pontoEsquerdo = null;
       Point pontoDireito = null;
       Point pontoAlto =null;
       Point pontoBaixo = null;
       blobs2 = new ArrayList<Point>();
       Point ponto = null;

       for(int w=imagem.getWidth()-1;w>=0;w--) {
         for(int h=imagem.getHeight()-1;h>=0;h--) {
                raster.getPixel(w, h, pixel);
                if (pixel[0]!=0) {
                        ponto = new Point(w,h);
                        if (pontoDireito!=null) {
                            if (ponto.getX()>pontoDireito.getX()) {
                                    pontoDireito = ponto;
                                    break;
                            }
                        } else {
                            pontoDireito = ponto;
                            break;
                        }
                    }
          }
        }

        for(int w=(int) pontoDireito.getX();w>=0;w--) {
            boolean contem = false;
            for(int h=imagem.getHeight()-1;h>=0;h--) {
                raster.getPixel(w, h, pixel);
                ponto = new Point(w,h);

                 if (pixel[0]!=0) {
                        if (pontoBaixo!=null) {
                            if (ponto.getY()>pontoBaixo.getY()&& ponto.getY()<imagem.getHeight()) {
                                if(w<imagem.getWidth())
                                pontoBaixo = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth())
                            pontoBaixo = ponto;
                        }
                    }

                if (pixel[0]!=0) {
                        if (pontoAlto!=null) {
                            if (ponto.getY()<pontoAlto.getY()) {
                                if(w<imagem.getWidth())
                                pontoAlto = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth())
                            pontoAlto = ponto;
                        }
                    }

                if (pixel[0]!=0)
                    contem=true;
            }
            if (contem==false) {
                pontoEsquerdo=ponto;
                break;
            }
        }

       if (pontoEsquerdo!=null && pontoDireito!=null && pontoAlto!=null) {
                blobs2.add(pontoEsquerdo);
                blobs2.add(pontoDireito);
                if (!changeDireita)
                    PontoLimite = pontoAlto;

                blobs2.add(pontoAlto);
                blobs2.add(pontoBaixo);
            }

       return blobs2;
    }


   
    public Point detectaCabeca(PlanarImage imagem) {
       Raster raster = imagem.getAsBufferedImage().getRaster();
       int[] pixel = new int[3];
        Point pontoAlto =null;

       Point ponto = null;
       if (!blobs.isEmpty() && !blobs2.isEmpty())
       for(int w=(int) blobs.get(1).getX();w<blobs2.get(0).getX();w++) {
         for(int h=0;h<imagem.getHeight();h++) {
                raster.getPixel(w, h, pixel);
                ponto = new Point(w,h);
                if (pixel[0]!=0) {
                        if (pontoAlto!=null) {
                            if (ponto.getY()<pontoAlto.getY()) {
                                if(w<imagem.getWidth())
                                pontoAlto = ponto;
                            }
                        } else {
                            if(w<imagem.getWidth())
                            pontoAlto = ponto;
                        }
                    }
           }
        }
        
       return pontoAlto;
    }


    public Point getPontoLimite() {
        return PontoLimite;
    }

    public void setPontoLimite(Point PontoLimite) {
        this.PontoLimite = PontoLimite;
    }

    public boolean isChangeDireita() {
        return changeDireita;
    }

    public void setChangeDireita(boolean changeDireita) {
        this.changeDireita = changeDireita;
    }


}
